package kr.co.bettersoft.pushchat.activity;

import java.util.Locale;

import kr.co.bettersoft.pushchat.common.CommonConstant;
import kr.co.bettersoft.pushchat.common.PushChatRest;
import kr.co.bettersoft.pushchat.domain.PushChatMember;
import kr.co.bettersoft.pushchat.fragment.FragmentHome;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 회원 가입 페이지이다
 *   이메일 주소 입력, 중복확인, 암호입력, 암호 확인,  회원등록 버튼이 있다
 * @author blue
 *
 */
public class RegisterMemberActivity extends Activity{
	/////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수

	String TAG = "RegisterMemberActivity";

	public final int SELECT_DUPLICATION_MEMBER = 101;		// 멤버 등록시 중복 검사를 한다.	
	public final int REGISTER_MEMBER = 102;		// 멤버를 등록 한다.	
	// selectDuplicationMember 	멤버 등록시 중복 검사를 한다.	pushChatMemberController	memberId activateYn		totalCount result
	//  registerMember  		멤버를 등록 한다.	memberId password nickName phoneNumber email comment profileImageUrl gender age
	// countryCode languageCode latitude longitude location openLocationYn personalityType deviceType registrationId receiveNotificationYn 
	// activateYn modifyDate registerDate				PushChatMember.result

	SharedPreferences sharedPrefCustom;	// 공용 프립스	

	// 로케일
	Locale locale;
	String countryCode, languageCode; 

	// 로그인용 아이디, 비번 값, 확인
	String userId = "";
	String password = "";
	String rePassword = "";

	// 중복확인, 중복 확인된 아이디 
	boolean duplicationChecked = false;
	String duplicationCheckedId = "";

	// 서버 호출용
	Boolean loading = false;
	PushChatRest pushChatRest;
	String callResult = "";	// 서버 호출 결과

	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;

	// 화면 구성 					 
	Button duplicationCheckBtn;		//	 중복체크 버튼
	Button registerBtn;				//	 등록 버튼
	EditText idText, pwText, rePwText;	//아이디/비번입력창

	ProgressBar pb1;		// 중단 로딩 진행바

	//////////////////////////////////////////////////////////////////////////////////////////////////////	


	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기. 띄우는 문구는 msg 로 받은 값
					Toast.makeText(RegisterMemberActivity.this, b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showAlert")==1){					 // 알림
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}else if(b.getInt("showAlert")==4){					 // 알림후 종료
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							goChatMain();

						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("initField")==1){		// 화면 로그인 정보 초기화 하기
					idText.setText("");
					pwText.setText("");
					rePwText.setText("");
				}
				if(b.getInt("registerEnable")==1){				// 화면 등록 버튼 사용 가능
					registerBtn.setEnabled(true);
				}else if(b.getInt("registerEnable")==2){		// 화면 등록 버튼 사용 불가
					registerBtn.setEnabled(false);
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					pb1.setVisibility(View.GONE);
				}
				switch (msg.what)
				{
				case SELECT_DUPLICATION_MEMBER : runOnUiThread(new RunnableSelectDuplicationMember());		// 멤버 등록시 중복 검사를 한다 selectDuplicationMember		
				break;
				case REGISTER_MEMBER : runOnUiThread(new RunnableRegisterMember());					// 멤버를 등록 한다 registerMember			
				break;
				default : 
					break;
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.register_member_activity);
		Log.w(TAG,"RegisterMemberActivity onCreate");

		// locale
		locale = getResources().getConfiguration().locale;
		countryCode = locale.getCountry();
		languageCode = locale.getLanguage();

		//			// 프립
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);

		pushChatRest = new PushChatRest();

		pb1=(ProgressBar) findViewById(R.id.progressbar);

		// 레이아웃의 개체들을 가져와서 사용

		idText = (EditText) findViewById(R.id.register_id_text);
		pwText = (EditText) findViewById(R.id.register_pw_text);
		rePwText = (EditText) findViewById(R.id.register_re_pw_text);

		duplicationCheckBtn = (Button) findViewById(R.id.duplication_check_btn);
		registerBtn = (Button) findViewById(R.id.register_btn);

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout = findViewById(R.id.parent_layout);			// 부모 레이아웃. 리스너 달아서 키보드 숨김에 사용
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.w(TAG,"parentLayout click");
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);
			}
		});
		// 버튼  리스너.
		duplicationCheckBtn.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View v) {
				handler.sendEmptyMessage(SELECT_DUPLICATION_MEMBER);
			}
		});	
		registerBtn.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View v) {
				registerDisable();
				handler.sendEmptyMessage(REGISTER_MEMBER);
			}
		});


	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////

	public void goChatMain(){
		//				//아이디 저장하고 가기.
		SharedPreferences.Editor saveuserIdToPref = sharedPrefCustom.edit();
		saveuserIdToPref.putString("userId", userId);			// 로그인한 가맹점 아이디 저장   
		saveuserIdToPref.putString("userPassword", password);			// 로그인한 가맹점 아이디 저장   

		saveuserIdToPref.putString("autoLoginId", userId);	 		// ** 비번도 저장할 것
		saveuserIdToPref.putString("autoLoginPw", password);	 		// ** 비번도 저장할 것
		saveuserIdToPref.putString("registeredYn", "Y"); 		//등록 여부

		// 자동 로그인 설정에 따라 저장
		saveuserIdToPref.putBoolean("autoLoginChecked", false);

		// 로그인한 상태로 바꿈
		saveuserIdToPref.putString("loginYn", "Y");	
		// 채팅방 비사용중(초기화)
		saveuserIdToPref.putBoolean("chatRoomUsingYn", false);	
		saveuserIdToPref.commit();
		Intent i = new Intent(this, FragmentHome.class);
		i.putExtra("userId", userId);

		startActivity(i);
		finish();
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////


	/**
	 * 러너블. 멤버 등록시 중복 검사를 한다
	 */
	class RunnableSelectDuplicationMember implements Runnable {
		public void run(){
			new backgroundThreadSelectDuplicationMember().execute();	
		}
	}
	/**
	 * backgroundThreadSelectDuplicationMember
	 * 비동기  .  멤버 등록시 중복 검사를 한다
	 * @author blue
	 *
	 */
	public class backgroundThreadSelectDuplicationMember extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadSelectDuplicationMember");

			userId = idText.getText()+"";
			if(userId.length()<1){
				// 아이디 미입력
				showResultDialog(returnThis().getResources().getString(R.string.input_your_id));			// showMsg("아이디를 입력해 주십시오.");
				loading = false;
				registerEnable();
			}else{
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);		// 키보드 숨김
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);

				// 파라미터 셋팅
				PushChatMember pushChatMemberParam = new PushChatMember();
				pushChatMemberParam.setMemberId(userId);
				// 서버 메소드 호출
				showPb();
				callResult = pushChatRest.RestSelectDuplicationMember(pushChatMemberParam);
				// 결과 처리
				if(callResult.equals("0")){
					// 사용 가능합니다.
					showResultDialog(getString(R.string.available_id));	
					duplicationChecked = true;
					duplicationCheckedId = userId;
				}else if(callResult.equals("F")){	
					// 사용 불가
					showResultDialog(getString(R.string.request_failed));			
					loading = false;
					registerEnable();
				}else{
					// 사용 불가
					showResultDialog(getString(R.string.available_not_id));				
					loading = false;
					registerEnable();
				}
				// 화면의 아이디, 비번 입력창 초기화.....
				hidePb();
			}
			return null; 
		}
	}



	/**
	 * 러너블. 멤버를 등록 한다.		registerMember
	 */
	class RunnableRegisterMember implements Runnable {
		public void run(){
			new backgroundThreadRegisterMember().execute();	
		}
	}
	/**
	 * backgroundThreadRegisterMember
	 * 비동기  .  멤버를 등록 한다.	
	 * @author blue
	 *
	 */
	public class backgroundThreadRegisterMember extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadRegisterMember");

			userId = idText.getText()+"";
			password = pwText.getText()+"";
			rePassword = rePwText.getText()+"";
			if(userId.length()<1){
				// 아이디 미입력
				showResultDialog(returnThis().getResources().getString(R.string.input_your_id));			// showMsg("아이디를 입력해 주십시오.");
				loading = false;
				registerEnable();
			}else if(password.length()<1){
				// 비번 미입력
				showResultDialog(returnThis().getResources().getString(R.string.input_your_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
				registerEnable();
			}else if(!password.equals(rePassword)){
				showResultDialog(returnThis().getResources().getString(R.string.not_eq_input_2_pw));							
				loading = false;
				registerEnable();
			}else if(!(duplicationChecked && duplicationCheckedId.equals(userId))){   //	duplicationChecked duplicationCheckedId 
				// 중복확인을 하고, 그 아이디가 동일할때를 제외한 경우 - 중복확인 안했거나, 했는데 아이디가 바뀌었거나.
				showResultDialog(returnThis().getResources().getString(R.string.need_id_duplication_check));			
				duplicationChecked = false;
				loading = false;
				registerEnable();
			}else{
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);		// 키보드 숨김
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);

				// 파라미터 셋팅
				PushChatMember pushChatMemberParam = new PushChatMember();
				pushChatMemberParam.setMemberId(userId);
				pushChatMemberParam.setPassword(password);
				pushChatMemberParam.setNickName(userId);		// 처음엔 아이디와 동일?
				pushChatMemberParam.setPhoneNumber("");			// 미입력. 인증 전번 사용 가능하나 폰에 대한 인증인지 가입에 대한 인증인지 확인 필요.. 가입에 대한 인증일 경우 전번 획득 가능
				pushChatMemberParam.setEmail(userId);			// 아이디와 동일		
				pushChatMemberParam.setComment("");		
				pushChatMemberParam.setProfileImageUrl("");
				pushChatMemberParam.setThumbnailUrl("");
				pushChatMemberParam.setGender("N/A");		// 비공개
				pushChatMemberParam.setAge("N/A");
				pushChatMemberParam.setCountryCode(countryCode);
				pushChatMemberParam.setLanguageCode(languageCode);
				pushChatMemberParam.setLatitude("");
				pushChatMemberParam.setLongitude("");
				pushChatMemberParam.setLocation("");
				pushChatMemberParam.setOpenLocationYn("N");
				pushChatMemberParam.setPersonalityType("");
				pushChatMemberParam.setDeviceType("AS");
				pushChatMemberParam.setRegistrationId("");
				pushChatMemberParam.setReceiveNotificationYn("Y");
				pushChatMemberParam.setRestrictionYn("Y");

				//  registerMember  		멤버를 등록 한다.	memberId password nickName phoneNumber email comment profileImageUrl gender age
				// countryCode languageCode latitude longitude location openLocationYn personalityType deviceType registrationId receiveNotificationYn 
				// activateYn modifyDate registerDate				PushChatMember.result

				// 서버 메소드 호출
				showPb();
				callResult = pushChatRest.RestRegisterMember(pushChatMemberParam);
				// 결과 처리
				if(callResult.equals("SUCCESS")){
					// 등록 성공
					showResultDialogFinish(getString(R.string.reg_member_success));	// 닫기까지	
					//goChatMain();
				}else{	
					// 등록 실패
					showResultDialog(getString(R.string.reg_member_fail));			
					loading = false;
					registerEnable();
				}
				// 화면의 아이디, 비번 입력창 초기화.....
				hidePb();
				initField();
			}
			return null; 
		}
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸	

	/**
	 * returnThis
	 *  컨택스트 반환한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}


	/*
	 * 핸들러 파트.
	 *  화면상의 변화가 있는 요청은 핸들러를 사용
	 */
	// 화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	/**
	 * showMsg
	 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showMsg(final String msg){		
		RegisterMemberActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showToast", 1);
				b.putString("msg", msg);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * showResultDialog
	 *   얼럿 띄운다
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialog(final String msg){
		RegisterMemberActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * showResultDialogFinish
	 *   얼럿 띄운다. 확인누르면 종료
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialogFinish(final String msg){
		RegisterMemberActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 4);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * initField
	 * 아이디, 비번 초기화.  로그인 성공 또는 실패 이후 화면에 있던 로그인 정보를 초기화 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void initField(){			
		RegisterMemberActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("initField", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * registerEnable
	 * 등록 버튼 사용 가능 하게 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void registerEnable(){		
		RegisterMemberActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("registerEnable", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * registerDisable
	 * 로그인 버튼 사용 불가로 만든다 (두번 눌리는것 방지)
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void registerDisable(){		
		RegisterMemberActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("registerEnable", 2);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		RegisterMemberActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		RegisterMemberActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
}
